/*
    文件内容: EchoServer类,业务类,回显服务器类
    文件名: EchoServer.cpp
    作者: 中国好青年(码农论坛)
    时间: 2024/9/15
*/

#include "EchoServer.h"

/* 
    函数名: EchoServer(const std::string &ip, uint16_t port)
    返回值: 无
    参  数: const std::string &ip, IP地址; uint16_t port, 端口号; timeout, -1 不设置超时, 0是一直超时,大于0则timeout毫秒超时
            int pthreadnums, IO线程个数 int workthreadnums, 工作线程个数
    函数作用: 设置tcpserver_的值, 设置回调函数,
*/
EchoServer::EchoServer(const std::string &ip, const uint16_t port, int timeout, int pthreadnums, int workthreadnums)
            :tcpserver_(ip,port,timeout,pthreadnums), workthreadpool_(workthreadnums, "WORK")
{
    tcpserver_.setNewConnectionCallback  (std::bind(&EchoServer::handleNewConnection,   this, std::placeholders::_1));
    tcpserver_.setCloseConnectionCallback(std::bind(&EchoServer::handleCloseConnection, this, std::placeholders::_1));
    tcpserver_.setErrorConnectionCallback(std::bind(&EchoServer::handleErrorConnection, this, std::placeholders::_1));
    tcpserver_.setOnmessageCallback      (std::bind(&EchoServer::handleOnmessage,       this, std::placeholders::_1, std::placeholders::_2));
    tcpserver_.setSendCompleteCallback   (std::bind(&EchoServer::handleSendComplete,    this, std::placeholders::_1));
    tcpserver_.setsetEpollTimeoutCallback(std::bind(&EchoServer::handleEpolltimeout,    this, std::placeholders::_1));
}

/* 
    函数名: ~EchoServer()
    返回值: 无
    参  数: 无
    函数作用: 无
*/
EchoServer::~EchoServer()
{

}

/* 
    函数名: Start()
    返回值: 无
    参  数: 无
    函数作用: 调用tcpserver.start函数
*/
void EchoServer::Start()
{
    tcpserver_.start();
}

/* 
    函数名: Stop()
    返回值: 无
    参  数: 无
    函数作用: 调用tcpserver.start函数
*/
void EchoServer::Stop()
{
    workthreadpool_.stop();
    tcpserver_.stop();
}

/* 
    函数名: handleNewConnection(spConnection conn)
    返回值: 无
    参  数: spConnection conn, 客户端连接上来的conn
    函数作用: 处理新连接上来的事件
*/
void EchoServer::handleNewConnection(spConnection conn)
{   
    debug("accept client(fd:%d,ip:%s,port:%d) threadid:%d\n", conn->fd(), conn->ip().c_str(), conn->port(), syscall(SYS_gettid));
}

/* 
    函数名: handleCloseConnection(spConnection conn)
    返回值: 无
    参  数: spConnection conn, 客户端连接上来的conn
    函数作用: 处理关闭socket事件
*/
void EchoServer::handleCloseConnection(spConnection conn)
{
    debug("client(%d) disconnect threadid:%d \n", conn->fd(), syscall(SYS_gettid));
}

/* 
    函数名: handleErrorConnection(spConnection conn)
    返回值: 无
    参  数: spConnection conn, 客户端连接上来的conn
    函数作用: 处理出错事件
*/
void EchoServer::handleErrorConnection(spConnection conn)
{
    debug("other events: client disconnect(%d) \n", conn->fd());
}

/* 
    函数名: handleOnmessage(spConnection conn, std::string message)
    返回值: 无
    参  数: spConnectionconn, 客户端连接上来的conn, conn 接收到的数据
    函数作用: 处理客户端发送的数据,放到处理数据线程中处理,监听线程继续监听
*/
void EchoServer::handleOnmessage(spConnection conn, std::string &message)
{   
    //处理数据
    debug("handleOnmessage threadid: %d\n", syscall(SYS_gettid));
    if(workthreadpool_.size() == 0)
    {
        onMessage(conn, message);
        return;
    }
    workthreadpool_.addtask(std::bind(&EchoServer::onMessage, this, conn, message));
}

/* 
    函数名: handleSendComplete(spConnection conn)
    返回值: 无
    参  数: spConnection conn, 客户端连接上来的conn
    函数作用: 处理发送数据成功的事件
*/
void EchoServer::handleSendComplete(spConnection conn)
{
    debug("send complete threadid: %ld\n", syscall(SYS_gettid));
}

/* 
    函数名: handleEpolltimeout(EventLoop *eploop)
    返回值: 无
    参  数: EventLoop *eploop, 底层epoll
    函数作用: 处理Epoll超时时间
*/
void EchoServer::handleEpolltimeout(EventLoop *eploop)
{
    debug("epoll timeout\n");
}

/* 
    函数名: onMessage(spConnection conn, std::string &message)
    返回值: 无
    参  数: spConnection conn,客户端ID std::string &message, 客户端发送的消息
    函数作用: 处理数据函数
*/
void EchoServer::onMessage(spConnection conn, std::string &message)
{
    message = "replay: " + message;
    conn -> send(message.data(), message.size());
}
